Skip to content

Improve positioning, Docker onboarding, and SEO guides - #2

Merged
AlexanderWagnerDev merged 18 commits into
mainfrom
agent/reach-and-seo
Jul 18, 2026
Merged

Improve positioning, Docker onboarding, and SEO guides#2
AlexanderWagnerDev merged 18 commits into
mainfrom
agent/reach-and-seo

Conversation

@AlexanderWagnerDev

@AlexanderWagnerDev AlexanderWagnerDev commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

What changed

  • Repositioned the homepage around two explicit audiences: library developers and self-hosted stream operators.
  • Replaced hard-coded release claims with registry/release links and one consistent active-alpha message.
  • Added a dedicated five-minute Docker + OBS quickstart with secure secret generation, health checks, troubleshooting, and production guidance.
  • Added four search-focused technical guides:
    • self-hosted RTMP server with Docker and OBS
    • RTMPS server configuration for OBS
    • Enhanced RTMP with HEVC, AV1, and Opus
    • OpenRTMP vs nginx-rtmp
  • Added canonical URLs, Open Graph/Twitter metadata, JSON-LD, robots.txt, and sitemap.xml.
  • Updated navigation, footer, downloads, and repository documentation to match the ecosystem positioning.
  • Added a website CI workflow that lints every PHP file, validates the sitemap, and smoke-tests all public pages.

Why

The previous site primarily presented OpenRTMP as a protocol library, even though the organization also provides a deployable server and panel. It also duplicated release numbers and mixed broad feature claims with more cautious repository-level alpha documentation. This made the value proposition harder to understand and allowed version/status text to drift.

User impact

New visitors can immediately choose between embedding librtmp2 and deploying the server stack. Operators get a copy-and-paste path to an OBS-ready deployment, while search engines receive dedicated canonical content for the main Docker, OBS, RTMPS, Enhanced RTMP, and nginx-rtmp comparison intents.

Validation

  • Added automated php -l validation for all PHP files.
  • Added XML validation for sitemap.xml.
  • Added local-server smoke tests for the homepage, quickstart, guides, docs, and download pages.
  • The branch is based directly on main with no unrelated changes.

Notes

The content deliberately distinguishes parser support, opaque codec relay, and full live-session integration. It avoids calling the project production-ready and points to repository implementation-status tables for code-accurate support boundaries.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag @codesmith with what you need. Autofix is disabled.

Summary by CodeRabbit

  • New Features

    • Added a refreshed OpenRTMP homepage with clearer deployment paths and project information.
    • Added Quickstart, Download, and Guides sections covering Docker, RTMPS, OBS, Enhanced RTMP, and server comparisons.
    • Added responsive layouts, content cards, checklists, callouts, FAQs, and table-of-contents navigation.
    • Added improved metadata, structured search information, sitemap, and crawler guidance.
  • Documentation

    • Updated local development, deployment, architecture, content, and guide-contribution documentation.
    • Revised footer and navigation links for easier access to resources and downloads.
  • Quality Improvements

    • Added automated checks for PHP pages, XML validity, and key public routes.

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@AlexanderWagnerDev, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 46 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Free

Run ID: 4a01719d-dd0d-4fdc-a988-b5c7ae0796dc

📥 Commits

Reviewing files that changed from the base of the PR and between 053d53e and dbdf3dd.

📒 Files selected for processing (3)
  • .github/workflows/site-checks.yml
  • assets/js/main.js
  • includes/header.php
📝 Walkthrough

Walkthrough

The PR refreshes the OpenRTMP website with shared responsive styling, revised homepage and deployment content, four new guide routes, updated metadata and navigation, crawler files, documentation, and automated PHP, XML, and public-route checks.

Changes

OpenRTMP website refresh

Layer / File(s) Summary
Shared presentation foundation
assets/css/content.css, includes/header.php, includes/footer.php
Adds responsive article, guide, card, callout, table, FAQ, and table-of-contents styling while updating shared metadata, navigation, footer links, and badges.
Homepage and deployment content
index.php, quickstart/index.php, download/index.php
Reworks the homepage and download route around Rust, Docker, server, panel, and library paths, and adds a structured Docker quickstart workflow.
Guide routes and instructional content
guides/index.php, guides/*/index.php
Adds the guide index and articles covering Docker self-hosting, RTMPS with OBS, Enhanced RTMP codecs, and OpenRTMP versus nginx-rtmp.
Site metadata and automated checks
README.md, .github/workflows/site-checks.yml, robots.txt, sitemap.xml
Documents site structure and content workflows, publishes crawler metadata and sitemap entries, and validates PHP files, XML, and public routes in GitHub Actions.

Estimated code review effort: 3 (Moderate) | ~25 minutes


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Contributor Author

Merge dependency

Please merge OpenRTMP/librtmp2-server-panel#68 before this PR. The new quickstart and download pages link to compose.quickstart.yml, which is introduced by that panel PR.

Recommended order:

  1. OpenRTMP/librtmp2-server-panel#68
  2. this PR
  3. OpenRTMP/.github#4

@AlexanderWagnerDev
AlexanderWagnerDev marked this pull request as ready for review July 18, 2026 21:34
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Reposition site for library/server audiences, add SEO guides, quickstart, and CI

✨ Enhancement 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Repositions the homepage, nav, footer, and download page around two audiences: library developers
 and self-hosted server operators.
• Adds a five-minute Docker + OBS quickstart and four SEO-focused guides (Docker self-hosting,
 RTMPS/OBS, Enhanced RTMP codecs, OpenRTMP vs nginx-rtmp).
• Adds canonical URLs, Open Graph/Twitter metadata, JSON-LD structured data, robots.txt, and
 sitemap.xml for search engines.
• Removes hard-coded release/version numbers in favor of registry/release links and a consistent
 alpha-status message.
• Adds a GitHub Actions workflow that lints PHP, validates the sitemap, and smoke-tests all public
 pages.
• Updates README to document the new site structure, content principles, and guide-authoring
 process.
Diagram

graph TD
  H["includes/header.php"] --> IDX["index.php"]
  H --> QS["quickstart/index.php"]
  H --> GD["guides/*/index.php"]
  H --> DL["download/index.php"]
  F["includes/footer.php"] --> IDX
  F --> QS
  F --> GD
  SM[(sitemap.xml)] --> SEO[External Search Engines]
  RB[robots.txt] --> SEO
  CI[[Website checks CI]] --> IDX
  CI --> GD
  CI --> SM

  subgraph Legend
    direction LR
    _file["File"] ~~~ _db[(Data file)] ~~~ _ext[[CI Job]]
  end
Loading
High-Level Assessment

For a static PHP marketing/documentation site, hand-authored PHP pages with shared header/footer includes and a lightweight CI smoke test are an appropriate, low-overhead approach. Introducing a static site generator or templating framework would add build complexity disproportionate to the site's size and update cadence.

Files changed (15) +1469 / -263

Enhancement (5) +591 / -235
content.cssAdd stylesheet for guide, quickstart, and article content +287/-0

Add stylesheet for guide, quickstart, and article content

• New CSS file with styles for path cards, check lists, callouts, article/prose layout, TOC sidebar, FAQ items, guide cards, and comparison tables, including responsive breakpoints.

assets/css/content.css

index.phpSimplify download page and remove hard-coded version numbers +86/-126

Simplify download page and remove hard-coded version numbers

• Reworks the download page to lead with a Docker quickstart path and library path, replaces manually copied version strings with links to crates.io/GHCR, consolidates the Docker Compose/run examples, and adds SEO metadata fields.

download/index.php

footer.phpAlign footer navigation and messaging with ecosystem positioning +19/-20

Align footer navigation and messaging with ecosystem positioning

• Updates footer copy, navigation links, and badges to reflect the developer/operator positioning, adds links to quickstart and guides, and adds an alpha status note.

includes/footer.php

header.phpAdd SEO metadata, canonical URLs, and structured data support to header +28/-9

Add SEO metadata, canonical URLs, and structured data support to header

• Introduces default page title/description, canonical URL computation, Open Graph/Twitter meta tags, optional JSON-LD structured data output, escaped output via htmlspecialchars, and updated navigation links.

includes/header.php

index.phpReposition homepage around library and server audiences +171/-80

Reposition homepage around library and server audiences

• Rewrites the homepage hero, adds a dual-path section for developers vs operators, replaces the Rust code sample with a Docker quickstart preview, adds JSON-LD structured data, and reworks the features/architecture/ecosystem sections.

index.php

Documentation (6) +593 / -28
README.mdRewrite README to document ecosystem, structure, and guide-authoring process +45/-28

Rewrite README to document ecosystem, structure, and guide-authoring process

• Updates the README with the three-project ecosystem description, revised local dev port and validation instructions, new file structure listing including guides/quickstart, content principles, guide-authoring steps, and deployment notes.

README.md

index.phpAdd Enhanced RTMP HEVC/AV1/Opus guide +116/-0

Add Enhanced RTMP HEVC/AV1/Opus guide

• New SEO-focused technical guide explaining Enhanced RTMP signaling, FourCC codecs, capability negotiation, OpenRTMP implementation boundaries, and a codec interoperability test plan.

guides/enhanced-rtmp-hevc-av1-opus/index.php

index.phpAdd guides landing page +60/-0

Add guides landing page

• New landing page linking to the four new technical guides with tags, summaries, and a CTA toward the quickstart and docs.

guides/index.php

index.phpAdd OpenRTMP vs nginx-rtmp comparison guide +112/-0

Add OpenRTMP vs nginx-rtmp comparison guide

• New guide comparing OpenRTMP and nginx-rtmp across architecture, administration, statistics, and features, with migration considerations and coexistence guidance.

guides/openrtmp-vs-nginx-rtmp/index.php

index.phpAdd RTMPS server configuration guide for OBS +124/-0

Add RTMPS server configuration guide for OBS

• New guide covering enabling RTMPS alongside RTMP, certificate setup, server configuration, verification steps, OBS connection instructions, and troubleshooting.

guides/rtmps-server-obs/index.php

index.phpAdd self-hosted Docker RTMP server guide +136/-0

Add self-hosted Docker RTMP server guide

• New guide describing the Docker stack architecture, deployment steps, stream key model, OBS publishing, monitoring, production checklist, and troubleshooting.

guides/self-hosted-rtmp-server-docker/index.php

Other (4) +285 / -0
site-checks.ymlAdd CI workflow for PHP lint, sitemap validation, and page smoke tests +51/-0

Add CI workflow for PHP lint, sitemap validation, and page smoke tests

• New GitHub Actions workflow that lints all PHP files with php -l, validates sitemap.xml with xmllint, and curls every public page against a local PHP server on PRs and pushes to main.

.github/workflows/site-checks.yml

index.phpAdd five-minute Docker + OBS quickstart page +168/-0

Add five-minute Docker + OBS quickstart page

• New page with a HowTo JSON-LD schema guiding users through cloning the repo, generating secrets, starting the Docker stack, creating a stream, publishing from OBS, moving to production, and troubleshooting.

quickstart/index.php

robots.txtAdd robots.txt crawler policy +4/-0

Add robots.txt crawler policy

• New file allowing all crawlers and pointing to the sitemap.

robots.txt

sitemap.xmlAdd public sitemap.xml +62/-0

Add public sitemap.xml

• New XML sitemap listing all indexable public pages with change frequency and priority values.

sitemap.xml

@qodo-code-review

qodo-code-review Bot commented Jul 18, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Canonical URL not normalized ✓ Resolved 🐞 Bug ≡ Correctness
Description
includes/header.php derives canonical URLs from $_SERVER['REQUEST_URI'] when $canonicalPath is
not set, so alternate paths like /docs/index.php can produce a different canonical than /docs/
for pages such as docs and legal. This can create duplicate canonicals/indexing fragmentation for
the same content depending on how the server routes requests.
Code

includes/header.php[R5-7]

+$canonicalPath = $canonicalPath ?? ($_SERVER['REQUEST_URI'] ?? '/');
+$canonicalPath = parse_url($canonicalPath, PHP_URL_PATH) ?: '/';
+$canonicalUrl = 'https://openrtmp.org' . $canonicalPath;
Evidence
includes/header.php uses $_SERVER['REQUEST_URI'] as the default canonical path and does not
strip directory index filenames. The docs/legal pages do not override $canonicalPath, so their
canonical depends on the exact URL used to reach them.

includes/header.php[1-8]
docs/index.php[1-6]
legal/index.php[1-6]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Some pages do not set `$canonicalPath`, so `includes/header.php` falls back to `$_SERVER['REQUEST_URI']` and uses its path verbatim. If the same page is reachable via both a directory URL and an `index.php` URL, the `<link rel="canonical">` will differ.

### Issue Context
- `docs/index.php` and `legal/index.php` currently don’t define `$canonicalPath`.
- `includes/header.php` builds `$canonicalUrl` directly from the (possibly unnormalized) request path.

### Fix Focus Areas
- includes/header.php[5-8]
- docs/index.php[1-6]
- legal/index.php[1-6]

### Recommended fix
Do one (or both):
1) Set `$canonicalPath` explicitly in pages that don’t set it today (e.g., `/docs/`, `/legal/`).
2) Add a small normalization step in `includes/header.php` after `parse_url(...)` to rewrite trailing `/index.php` to `/` (and ensure the path always starts with `/`).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. ARIA expanded never updates ✓ Resolved 🐞 Bug ≡ Correctness
Description
The nav toggle button is initialized with aria-expanded="false", but the click handler only
toggles a CSS class and never updates aria-expanded, leaving assistive technologies with stale
state after opening/closing the menu. This is an accessibility correctness regression introduced by
adding the ARIA attribute without syncing it in JS.
Code

includes/header.php[53]

+    <button class="nav-toggle" aria-label="Toggle navigation" aria-expanded="false">&#9776;</button>
Evidence
Markup declares an aria-expanded state, but the only toggle behavior in JS changes CSS classes, so
the ARIA state remains incorrect.

includes/header.php[36-55]
assets/js/main.js[10-18]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The navigation toggle button has `aria-expanded="false"`, but JavaScript never updates it when toggling the menu.

### Issue Context
`assets/js/main.js` toggles `.open` on the `.nav` container only.

### Fix Focus Areas
- includes/header.php[53-54]
- assets/js/main.js[10-18]

### Recommended fix
In `initNavToggle()`, after toggling `.open`, set:
- `const isOpen = nav.classList.contains('open');`
- `toggle.setAttribute('aria-expanded', String(isOpen));`
Optionally add `aria-controls` to the button and an `id` to the controlled element for stronger semantics.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

3. Unescaped JSON-LD script ✓ Resolved 🐞 Bug ⛨ Security
Description
includes/header.php emits JSON-LD via json_encode(...) directly inside a <script> tag without
JSON_HEX_* escaping, so any future structured-data value containing </script> could break out of
the tag and inject HTML/JS. In this PR the values appear repo-controlled, so this is a
defense-in-depth hardening issue.
Code

includes/header.php[R30-32]

+<?php if (!empty($structuredData)): ?>
+<script type="application/ld+json"><?php echo json_encode($structuredData, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); ?></script>
+<?php endif; ?>
Evidence
The JSON-LD payload is inserted verbatim into a <script> element; without JSON_HEX_TAG (etc.),
certain substrings can terminate the script element in HTML parsing.

includes/header.php[27-32]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
JSON-LD is rendered inside a raw `<script>` element. Plain `json_encode` does not make the output safe for HTML script context (e.g., a literal `</script>` in a string can terminate the script element).

### Issue Context
Current structured data is hard-coded, but this becomes risky if structured data is ever composed from non-trusted sources (or even copied text that may include `</script>`).

### Fix Focus Areas
- includes/header.php[30-32]

### Recommended fix
Update the `json_encode` call to include HTML-safe escaping flags, e.g.:
- `JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE`
so `<`, `>`, `&`, quotes are escaped appropriately inside the script context.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Smoke test misses legal ✓ Resolved 🐞 Bug ☼ Reliability
Description
The new CI smoke-test loop does not request /legal/ even though it is listed in sitemap.xml, so
regressions on that public page won’t be caught by the workflow. This reduces CI coverage relative
to the public pages declared for indexing.
Code

.github/workflows/site-checks.yml[R40-50]

+          for path in \
+            / \
+            /quickstart/ \
+            /guides/ \
+            /guides/self-hosted-rtmp-server-docker/ \
+            /guides/rtmps-server-obs/ \
+            /guides/enhanced-rtmp-hevc-av1-opus/ \
+            /guides/openrtmp-vs-nginx-rtmp/ \
+            /docs/ \
+            /download/; do
+            curl --fail --silent --show-error "http://127.0.0.1:8090${path}" >/dev/null
Evidence
The workflow enumerates paths to curl but omits /legal/, while the sitemap declares /legal/ as a
public URL.

.github/workflows/site-checks.yml[34-51]
sitemap.xml[57-61]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
CI smoke-test does not include the `/legal/` route.

### Issue Context
`sitemap.xml` includes `/legal/`, implying it is a public, indexable page.

### Fix Focus Areas
- .github/workflows/site-checks.yml[40-50]
- sitemap.xml[57-61]

### Recommended fix
Add `/legal/` to the list of paths in the smoke-test loop so it is checked like the other public pages.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread includes/header.php
Comment thread includes/header.php
Comment thread includes/header.php
Comment thread .github/workflows/site-checks.yml
… coverage

- Normalize the canonical path by stripping a trailing /index.php so
  directory and index.php URLs for the same page (docs, legal) emit
  an identical canonical link.
- Add JSON_HEX_* flags to the JSON-LD json_encode call so structured
  data can never break out of the surrounding <script> tag.
- Sync the nav toggle's aria-expanded attribute with its open/closed
  state in main.js instead of only toggling a CSS class.
- Add /legal/ to the CI smoke-test route list so it matches
  sitemap.xml coverage.

Addresses the SonarCloud quality gate failures (Security/Reliability
ratings on new code) flagged on this PR.
Fix review findings: canonical URL normalization, JSON-LD escaping, ARIA state, CI coverage
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
C Security Rating on New Code (required ≥ A)
B Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

💡 Need a hand with PR review? Try Gitar by Sonar!

@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit dbdf3dd

@AlexanderWagnerDev
AlexanderWagnerDev merged commit e333284 into main Jul 18, 2026
2 of 3 checks passed
@AlexanderWagnerDev
AlexanderWagnerDev deleted the agent/reach-and-seo branch July 18, 2026 21:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants